package co.edu.usbcali.presentation.backingBeans;

import java.io.Serializable;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.TimeZone;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
//import org.jsoup.select.Elements;
import org.primefaces.component.commandbutton.CommandButton;
import org.primefaces.component.inputtext.InputText;
import org.primefaces.context.RequestContext;
import org.primefaces.event.NodeSelectEvent;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;

import co.edu.usbcali.modelo.Entradas;
import co.edu.usbcali.modelo.Rss;
import co.edu.usbcali.modelo.dto.ColeccionesDTO;
import co.edu.usbcali.modelo.dto.Entrada;
import co.edu.usbcali.modelo.dto.EntradasDTO;
import co.edu.usbcali.modelo.dto.RssDTO;
import co.edu.usbcali.modelo.dto.UsuariosDTO;
import co.edu.usbcali.presentation.businessDelegate.IBusinessDelegatorView;
import co.edu.usbcali.utilities.FacesUtils;

import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.io.SyndFeedInput;
import com.sun.syndication.io.XmlReader;

/**
 * @author Zathura Code Generator http://code.google.com/p/zathura
 * www.zathuracode.org
 *
 */
@ManagedBean
@ViewScoped
public class RssView implements Serializable {
    private static final long serialVersionUID = 1L;
    private InputText txtUrl;
    private InputText txtUrlModificar;
    private InputText txtCodigoRss;
    private CommandButton btnSave;
    private CommandButton btnModify;
    private CommandButton btnDelete;
    private CommandButton btnClear;
    private List<RssDTO> data;
    private RssDTO selectedRss;
    private Rss entity;
    @ManagedProperty(value = "#{BusinessDelegatorView}")
    private IBusinessDelegatorView businessDelegatorView;
    UsuariosDTO usuario; 
    private TreeNode raizColecciones;
    private TreeNode seleccionColecciones;
    private List<ColeccionesDTO> colecciones;
    private ColeccionesDTO selectedColeccion;
    
    private TreeNode raizRss;
    private TreeNode seleccionRss;
    private SyndFeed feed;
    private List<Entrada> listaEntradas;
    private String url;
    private List<Entrada> favoritos;
    private Entrada selectedFavorito;
        
    private TreeNode raizFavorito;
    private TreeNode seleccionFavorito;
    
    private List<SelectItem> listaColecciones;
	private String coleccion;

	public RssView() {
        super();
    }
    
	@PostConstruct
    public void traerColecciones(){
		
		usuario=(UsuariosDTO) FacesUtils.getManagedBeanFromSession("usuario");

		raizColecciones=new DefaultTreeNode("Raiz", null);
	
		raizFavorito=new DefaultTreeNode("Raiz", null);
		ColeccionesDTO favorito=new ColeccionesDTO();
		favorito.setNombre("FAVORITOS");
		favorito.setIcono("ui-icon-star");
		new DefaultTreeNode(favorito, raizFavorito);
		String email = FacesContext.getCurrentInstance().getExternalContext()
				.getUserPrincipal().getName();
		
		try {
			colecciones=businessDelegatorView.coleccionesUsuario(email);

			for (ColeccionesDTO coleccion : colecciones) {
					coleccion.setIcono("ui-icon-folder-collapsed");
					 new DefaultTreeNode(coleccion, raizColecciones);
			}
			
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}		
    }
	
    public String crear(){
    	try {
        	selectedColeccion=(ColeccionesDTO) seleccionColecciones.getData();
        	txtUrl.setValue(null);
        	
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}
    	
    	return "";
    }
    
    public String ver(){
    	try {
        	selectedColeccion=(ColeccionesDTO) seleccionColecciones.getData();
        	raizRss=new DefaultTreeNode("Raiz", null);
			data=businessDelegatorView.rssColeccion(selectedColeccion.getCodigoCole());
			for (RssDTO rss : data) {
				 new DefaultTreeNode(rss, raizRss);
			}
			
			if(data==null||data.size()==0){
				raizRss=null;
				FacesUtils.addInfoMessage("Coleccion vacia");
			}
        	
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}
    	
    	return "";
    }
    
    public void consultarEntradaFavoritas(){
    	
    	favoritos=new ArrayList<Entrada>();
    	
    	try {
        List<EntradasDTO> entradasFBD=	businessDelegatorView.consultarFavoritosUsuario(usuario.getCodigoUsua());
        
        Entrada entrada=null;
        for (int i = 0; i < entradasFBD.size(); i++) {
			
        	String urlStr=entradasFBD.get(i).getUrl();
        	   
        	Connection con = Jsoup.connect(urlStr);
        	con.timeout(300000);
        		    /* this browseragant thing is important to trick servers into sending us the LARGEST versions of the images */
        		    con.userAgent("Google Chrome 3.0");
        		    Document doc = con.get();

        		    String titulo = doc.title();
        		    
        		        entrada=new Entrada();
        		    	entrada.setEnlace(urlStr);
        		    	entrada.setTitulo(titulo);
        		    	entrada.setDescripcion(doc.select("meta[name=description]").get(0).attr("content"));
        		    	entrada.setCodigoEntrada(entradasFBD.get(i).getCodigoEntra());
        		    	entrada.setCodigoRss(entradasFBD.get(i).getCodigoRss_Rss());
        		    	favoritos.add(entrada);
            	
		}
        
        listaEntradas=null;
        RequestContext.getCurrentInstance().update("form");
        
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

    	
    }
    
    //Seleccionar Coleccion
    public void onNodeSelectColeccion(NodeSelectEvent event){
    	try {
    		selectedColeccion=(ColeccionesDTO) event.getTreeNode().getData();
        	       		       		
                    /*String urlStr="http://vortexbird.com/";
        		    Connection con = Jsoup.connect(urlStr);

        		    con.userAgent("Google Chrome 3.0");
        		    Document doc = con.get();
       		           		    
        		    Elements metaRss = doc.select("link[type=application/rss+xml]");
        		    
        		    for (int i = 0; i < metaRss.size(); i++) {
        		    	System.out.println(metaRss.get(i).attr("href"));
					}*/
        		
        		
        		raizRss=new DefaultTreeNode("Raiz", null);
    			data=businessDelegatorView.rssColeccion(selectedColeccion.getCodigoCole());
    			for (RssDTO rss : data) {
    				 new DefaultTreeNode(rss, raizRss);
    			}
    			
    			if(data==null||data.size()==0){
    				raizRss=null;
    				FacesUtils.addInfoMessage("Coleccion vacia");
    			}else{
    				favoritos=null;
    		        RequestContext.getCurrentInstance().update("form:txtRSS");
    			}

  	
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

    }
    
    //Coleccion Favorito
    public void onNodeSelectFavorito(NodeSelectEvent event){
    	try {
    		selectedColeccion=(ColeccionesDTO) event.getTreeNode().getData();
        		
        		consultarEntradaFavoritas();
        		
        		if(favoritos==null||favoritos.size()==0){
        			FacesUtils.addInfoMessage("No hay Entradas en favoritos");
        		}

  	
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

    }
    
    
    public String modificar(){
    	try {
        	selectedRss=(RssDTO) seleccionRss.getData();
        	txtUrlModificar.setValue(selectedRss.getUrl());
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}
    	
    	return "";
    }
        
    public String action_create() {
        try {
        	
        	Long codCole=Long.parseLong(coleccion);
        	
        	if(codCole!=null){
                entity = new Rss();
                entity.setCodigoCole(codCole);
                entity.setUrl(FacesUtils.checkString(txtUrl));
                businessDelegatorView.saveRss(entity);
                FacesUtils.addInfoMessage("Se creo el RSS con exito");
            	ver();
                RequestContext.getCurrentInstance().execute("$('#dlgRSS').modal('hide');");
        	}else{
        		FacesUtils.addErrorMessage("Seleccione colección");
        		RequestContext.getCurrentInstance().execute("PF('dlgRSS').show()");
        	}
        	

        } catch (Exception e) {
            entity = null;
            FacesUtils.addErrorMessage(e.getMessage());
        }

        return "";
    }
    
    public String action_modify() {
        try {
            if (entity == null) {
                Long codigoRss = new Long(selectedRss.getCodigoRss());
                entity = businessDelegatorView.getRss(codigoRss);
            }

            entity.setUrl(FacesUtils.checkString(txtUrlModificar));
            businessDelegatorView.updateRss(entity);
            FacesUtils.addInfoMessage("El RSS se modificon con exito");
            ver();
            RequestContext.getCurrentInstance().execute("$('#dlgModificar').modal('hide');");
        } catch (Exception e) {
            FacesUtils.addErrorMessage(e.getMessage());
        }

        return "";
    }

    //////////Traer Entradas RSS
    @SuppressWarnings("unchecked")
	public void cargar_Feed(NodeSelectEvent event){
    	
        try {
        	selectedRss=(RssDTO) event.getTreeNode().getData();;
        	String url2=selectedRss.getUrl();
            URL feedUrl = new URL(url2);
            SyndFeedInput input = new SyndFeedInput();
            feed = input.build(new XmlReader(feedUrl));
        
    	
        //Obtiene las entradas del archivo XML
        List<SyndEntry> entradas;
        listaEntradas=new ArrayList<Entrada>();
        entradas = feed.getEntries();
        
        //Recorre todos los items y los añade a un HashMap
        Iterator<SyndEntry> it = entradas.iterator();
        while (it.hasNext()) {
            SyndEntry entrada = it.next();
            Entrada tmp_item = new Entrada();
            tmp_item.setTitulo( entrada.getTitle() );
            tmp_item.setDescripcion( entrada.getDescription().getValue() );
            tmp_item.settDescripcion( entrada.getDescription().getType() );
            tmp_item.setFecha_Publicacion( entrada.getPublishedDate() );
            tmp_item.setAutor( entrada.getAuthor() );
            tmp_item.setEnlace( entrada.getLink() );
            tmp_item.setCodigoRss(selectedRss.getCodigoRss());
            listaEntradas.add(tmp_item);
        }
        
        } catch (Exception e) {
        	FacesUtils.addErrorMessage(e.getMessage());
        }
        
    }
    
    
    //////////////Eliminar RSS
    public void action_delete() throws Exception {
        try {
        	selectedRss=(RssDTO) seleccionRss.getData();
        	Rss rss= businessDelegatorView.getRss(selectedRss.getCodigoRss());
            businessDelegatorView.deleteRss(rss);
            
            raizRss=new DefaultTreeNode("Raiz", null);
			data=businessDelegatorView.rssColeccion(selectedColeccion.getCodigoCole());
			for (RssDTO rss2 : data) {
				 new DefaultTreeNode(rss2, raizRss);
			}
			
			if(data==null||data.size()==0){
				FacesUtils.addInfoMessage("Coleccion vacia");
			}
            
            FacesUtils.addInfoMessage("El RSS se elimino con éxito");
        } catch (Exception e) {
            FacesUtils.addErrorMessage(e.getMessage());
        }
    }
     
    public void guardarFavorito(String urlEntrada) {
    	
    	try {
    		Entradas entrada=new Entradas();
    		entrada.setUrl(urlEntrada);
    		entrada.setFavorito("S");
    		entrada.setFechaFavorito(new Date());
    		entrada.setLeido("N");
    		entrada.setRss(businessDelegatorView.getRss(selectedRss.getCodigoRss()));
    		entrada.setCodigoUsua(usuario.getCodigoUsua());
			businessDelegatorView.guardarFavorito(entrada);
			FacesUtils.addInfoMessage("La Entrada se aguego a favoritos con exito");
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}
    	
    }
    
    public void eliminarFavorito(Long codEntrada){
    	
    	try {			
    		businessDelegatorView.eliminarFavorito(codEntrada);
    		consultarEntradaFavoritas();
    		FacesUtils.addInfoMessage("La Entrada se elimino de favoritos");
    		
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}
    	
    }
    
    public void leer(Entrada entradaLeida){
    	
    	try {
    		Entradas entrada=new Entradas();
    		entrada.setUrl(entradaLeida.getEnlace());
    		entrada.setFavorito("N");
    		entrada.setLeido("S");
    		entrada.setFechaLeido(new Date());
    		entrada.setRss(businessDelegatorView.getRss(entradaLeida.getCodigoRss()));
    		entrada.setCodigoUsua(usuario.getCodigoUsua());
    		
    		businessDelegatorView.leerEntrada(entrada);
    		    		
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}
    	
    }
         
    ///////////////////////////////////////////////////////////
    
    public String action_delete_master() {
        try {
            Long codigoRss = FacesUtils.checkLong(txtCodigoRss);
            entity = businessDelegatorView.getRss(codigoRss);
            action_delete();
        } catch (Exception e) {
            FacesUtils.addErrorMessage(e.getMessage());
        }

        return "";
    }  

    public InputText getTxtUrl() {
        return txtUrl;
    }

    public void setTxtUrl(InputText txtUrl) {
        this.txtUrl = txtUrl;
    }

    public InputText getTxtCodigoRss() {
        return txtCodigoRss;
    }

    public void setTxtCodigoRss(InputText txtCodigoRss) {
        this.txtCodigoRss = txtCodigoRss;
    }

    public List<RssDTO> getData() {
        try {
            if (data == null) {
                data = businessDelegatorView.getDataRss();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return data;
    }

    public void setData(List<RssDTO> rssDTO) {
        this.data = rssDTO;
    }

    public RssDTO getSelectedRss() {
        return selectedRss;
    }

    public void setSelectedRss(RssDTO rss) {
        this.selectedRss = rss;
    }

    public CommandButton getBtnSave() {
        return btnSave;
    }

    public void setBtnSave(CommandButton btnSave) {
        this.btnSave = btnSave;
    }

    public CommandButton getBtnModify() {
        return btnModify;
    }

    public void setBtnModify(CommandButton btnModify) {
        this.btnModify = btnModify;
    }

    public CommandButton getBtnDelete() {
        return btnDelete;
    }

    public void setBtnDelete(CommandButton btnDelete) {
        this.btnDelete = btnDelete;
    }

    public CommandButton getBtnClear() {
        return btnClear;
    }

    public void setBtnClear(CommandButton btnClear) {
        this.btnClear = btnClear;
    }

    public TimeZone getTimeZone() {
        return java.util.TimeZone.getDefault();
    }

    public IBusinessDelegatorView getBusinessDelegatorView() {
        return businessDelegatorView;
    }

    public void setBusinessDelegatorView(
        IBusinessDelegatorView businessDelegatorView) {
        this.businessDelegatorView = businessDelegatorView;
    }

	public TreeNode getRaizColecciones() {
		return raizColecciones;
	}

	public void setRaizColecciones(TreeNode raizColecciones) {
		this.raizColecciones = raizColecciones;
	}

	public TreeNode getSeleccionColecciones() {
		return seleccionColecciones;
	}

	public void setSeleccionColecciones(TreeNode seleccionColecciones) {
		this.seleccionColecciones = seleccionColecciones;
	}

	public TreeNode getRaizRss() {
		return raizRss;
	}

	public void setRaizRss(TreeNode raizRss) {
		this.raizRss = raizRss;
	}

	public TreeNode getSeleccionRss() {
		return seleccionRss;
	}

	public void setSeleccionRss(TreeNode seleccionRss) {
		this.seleccionRss = seleccionRss;
		try {
			selectedRss=(RssDTO) seleccionRss.getData();	
			url=selectedRss.getUrl();
		} catch (Exception e) {

		}
		
	}

	public InputText getTxtUrlModificar() {
		return txtUrlModificar;
	}

	public void setTxtUrlModificar(InputText txtUrlModificar) {
		this.txtUrlModificar = txtUrlModificar;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public List<Entrada> getFavoritos() {
		return favoritos;
	}

	public void setFavoritos(List<Entrada> favoritos) {
		this.favoritos = favoritos;
	}

	public List<Entrada> getListaEntradas() {
		return listaEntradas;
	}

	public void setListaEntradas(List<Entrada> listaEntradas) {
		this.listaEntradas = listaEntradas;
	}

	public ColeccionesDTO getSelectedColeccion() {
		return selectedColeccion;
	}

	public void setSelectedColeccion(ColeccionesDTO selectedColeccion) {
		this.selectedColeccion = selectedColeccion;
	}

	public TreeNode getSeleccionFavorito() {
		return seleccionFavorito;
	}

	public void setSeleccionFavorito(TreeNode seleccionFavorito) {
		this.seleccionFavorito = seleccionFavorito;
	}

	public TreeNode getRaizFavorito() {
		return raizFavorito;
	}

	public void setRaizFavorito(TreeNode raizFavorito) {
		this.raizFavorito = raizFavorito;
	}
	
    public Entrada getSelectedFavorito() {
		return selectedFavorito;
	}

	public void setSelectedFavorito(Entrada selectedFavorito) {
		this.selectedFavorito = selectedFavorito;
	}

	public List<SelectItem> getListaColecciones() {
		if(listaColecciones==null){
			listaColecciones=new ArrayList<SelectItem>();
			for (int i = 0; i < colecciones.size(); i++) {
				listaColecciones.add(new SelectItem(colecciones.get(i).getCodigoCole(), colecciones.get(i).getNombre()));
				
			}
		}
		return listaColecciones;
	}

	public void setListaColecciones(List<SelectItem> listaColecciones) {
		this.listaColecciones = listaColecciones;
	}

	public String getColeccion() {
		return coleccion;
	}

	public void setColeccion(String coleccion) {
		this.coleccion = coleccion;
	}
	
	
}
